package xlog

const (
	LevelDebug = 1 << iota
	LevelInfo
	LevelWarn
	LevelError
	LevelPanic
	LevelFatal

	LevelDev  = LevelDebug | LevelInfo | LevelWarn | LevelError | LevelFatal | LevelPanic
	LevelProd = LevelInfo | LevelWarn | LevelError | LevelFatal | LevelPanic
)

var (
	// level 的前缀字符串
	defaultLevelPrefixes = map[int]string{
		LevelDebug: "DEBU",
		LevelInfo:  "INFO",
		LevelWarn:  "WARN",
		LevelError: "ERRO",
		LevelPanic: "PANI",
		LevelFatal: "FATA",
	}

	// level 颜色, 颜色参数格式: 格式：\033[显示方式;前景色;背景色m
	levelColor = map[int]string{
		-1: "\033[0m", // 重置
		// LevelDebug: "DEBU",
		LevelInfo:  "\033[1;32m",   // 绿色
		LevelWarn:  "\033[1;33m",   // 黄色
		LevelError: "\033[1;31m",   // 红色
		LevelPanic: "\033[1;35m",   // 紫红色
		LevelFatal: "\033[1;35m", // 加粗紫红色
	}
)

// SetLevel 设置日志级别
func (x *XLogger) SetLevel(level int) {
	x.config.Level = level | LevelPanic | LevelFatal
}

// GetLevel 获取配置的日志级别
func (x *XLogger) GetLevel() int {
	return x.config.Level
}

// SetLevelPrefix 设置日志前缀
func (x *XLogger) SetLevelPrefix(level int, prefix string) {
	x.config.LevelPrefixes[level] = prefix
}

// GetLevelPrefix 获取日志前缀
func (x *XLogger) GetLevelPrefix(level int) string {
	return x.config.LevelPrefixes[level]
}

// getLevelPrefixWithBrackets
func (x *XLogger) getLevelPrefixWithBrackets(level int) string {
	str, ok := x.config.LevelPrefixes[level]
	if !ok {
		str = defaultLevelPrefixes[level]
	}

	// 判断下是否需要对内容加颜色显示
	// 1. 配置了打印颜色
	// 2. 不写入日志文件(主要防止写入的 level 部分包含 \033xxx 字符扰乱日志)
	if x.config.StdPrintLevelColor && x.config.FilePath == "" {
		str = levelColor[level] + str + levelColor[-1] // 同时需要重置下
	}
	return "[" + str + "]"
}

// checkLevel
func (x *XLogger) checkLevel(level int) bool {
	return x.config.Level&level > 0
}
